<?php
	error_reporting(E_ERROR);
	function preparaString($inputTiposConstantes, $inputConceitoAlvo, $inputBK, $inputTeste) {
		/*Pegando os Tipos e as Constantes*/
		$inputTiposConstantes	=	str_replace("\r\n", "\n", $inputTiposConstantes);
		$inputTiposConstantes	=	preg_replace("/\\n{2,}/", "\n", $inputTiposConstantes);
		$inputTiposConstantes	=	preg_replace("/\\n*$/", "", $inputTiposConstantes);
		$inputTiposConstantes	.="\n\n";
		
		/*Pegando o conceito alvo e os exemplos*/
		$inputConceitoAlvo	=	str_replace("\r\n", "\n", $inputConceitoAlvo);
		$inputConceitoAlvo	=	preg_replace("/\\n{2,}/", "\n", $inputConceitoAlvo);
		$inputConceitoAlvo	=	preg_replace("/\\n*$/", "", $inputConceitoAlvo);
		$inputConceitoAlvo  .="\n";
		
		$inputConceitoAlvo	=	explode("\n.\n", $inputConceitoAlvo);
		for ($nRelacao = 0; $nRelacao < (sizeof($inputConceitoAlvo)-1); $nRelacao++ ){
			/*Separando exemplos para dividir em 2/3 - 1/3*/
			$resultado	=	separaExemplos($inputConceitoAlvo[$nRelacao]);
			
			$relacoes[$nRelacao]	=	$resultado['relacao'];
			$exemplosPos[$nRelacao]	=	$resultado['exemplosPos'];
			$exemplosNeg[$nRelacao]	=	$resultado['exemplosNeg'];
		}
		
		/*Pegando o conhecimento Preliminar BK*/
		$inputBK	=	str_replace("\r\n", "\n", $inputBK);
		$inputBK	=	preg_replace("/\\n{2,}/", "\n", $inputBK);
		$inputBK	=	preg_replace("/\\n*$/", "", $inputBK);
		$inputBK  .="\n";
		
		/*Verificando qual a Running Option selecionada*/
		if ($inputTeste != "") {
			/*Pegando Exemplos de Teste*/
			$inputTeste	=	"\n" . str_replace("\r\n", "\n", $inputTeste);
			$inputTeste	=	preg_replace("/\\n{2,}/", "\n", $inputTeste);
			$inputTeste	=	preg_replace("/\\n*$/", "", $inputTeste);
			$strTesteSeparada	 =	explode("\n.\n", $inputTeste);
			for ($nRelacao = 0; $nRelacao < sizeof($strTesteSeparada); $nRelacao++) {
				$exemplos	=	preg_match_all("/(\+|\-)/", $strTesteSeparada[$nRelacao], $vetorExemplosTeste);
				if ($exemplos) {
					$totalPositivo[$nRelacao]	=	0;
					$totalNegativo[$nRelacao]	=	0;
					foreach($vetorExemplosTeste[0] as $exemploTeste) {
						if ($exemploTeste	==	"+") {
							$totalPositivo[$nRelacao]	++;
						}
						else {
							$totalNegativo[$nRelacao]	++;
						}
					}
				}
			}
		}
		else {
			$totalPositivo	=	0;
			$totalNegativo	=	0;
		}
		return array('tipos' => $inputTiposConstantes, 'relacoes' => $relacoes, 'exemplosPos' => $exemplosPos, 'exemplosNeg' => $exemplosNeg, 'bk' => $inputBK, 'teste' => $inputTeste, 'testePos' => $totalPositivo, 'testeNeg' => $totalNegativo);
	}

	function separaExemplos($strConceitoAlvoSeparada) {
		$exemplosDivididos	=	explode("\n;\n", $strConceitoAlvoSeparada);
		
		$tempRelacaoExemplosPos	=	explode(")\n", $exemplosDivididos[0]);
		$relacao				=	$tempRelacaoExemplosPos[0] . ")";
		$exemplosPos			=	explode("\n", $tempRelacaoExemplosPos[1]);
		$exemplosNeg			=	explode("\n", $exemplosDivididos[1]);
		$resultado['relacao']		=	$relacao;
		$resultado['exemplosPos']	=	$exemplosPos;
		$resultado['exemplosNeg']	=	$exemplosNeg;
		return $resultado;
	}

	function construirStrConceitoAlvo($relacoes, $exemplosPos, $exemplosNeg) {
		$inputConceitoAlvo	=	"";
		for ($nRelacao = 0; $nRelacao < sizeof($relacoes); $nRelacao++) {
			/*Colocando a relacao novamente*/
			$inputConceitoAlvo	.=	$relacoes[$nRelacao] . "\n";
			/*Colocando Exemplos Positivos*/
			$inputConceitoAlvo	.=	implode("\n", $exemplosPos[$nRelacao]) . "\n";
			/*Colocando ";" caso haja negativos*/
			if (sizeof($exemplosNeg) > 0) {
				$inputConceitoAlvo .= ";\n";
			}
			/*Colocando Exemplos Negativos*/
			$inputConceitoAlvo	.=	implode("\n", $exemplosNeg[$nRelacao]) . "\n";
			$inputConceitoAlvo	.= ".\n";
		}
		return $inputConceitoAlvo;
	}
	
	function construirTesteHoldout($relacoes, $exemplosPos, $exemplosNeg) {
		/*Colocando uma linha em branco entre o BK e os Exemplos de Teste*/
		$strTeste		=	"\n";
		foreach ($relacoes as $numRelacao => $relacao){										
			shuffle($exemplosPos[$numRelacao]);
			shuffle($exemplosNeg[$numRelacao]);
			$totalTestePos[$numRelacao]	=	intval(sizeof($exemplosPos[$numRelacao])/3);
			$totalTesteNeg[$numRelacao]	=	intval(sizeof($exemplosNeg[$numRelacao])/3);
			$vetorRelacaoTemp	=	explode("(", $relacao);
			$strTeste			.=	$vetorRelacaoTemp[0] . "\n";
			for ($i = 0; $i < $totalTestePos[$numRelacao]; $i++) {
				$strTeste	.=	array_pop($exemplosPos[$numRelacao]) . ": +\n";
			}
			for ($i = 0; $i < $totalTesteNeg[$numRelacao]; $i++) {
				$strTeste	.=	array_pop($exemplosNeg[$numRelacao]) . ": -\n";
			}
			$strTeste .= ".\n";
		}
		$strTeste	=	preg_replace("/\\n$/", "", $strTeste);
		return array('exemplosPos'	=>	$exemplosPos, 'exemplosNeg'	=>	$exemplosNeg, 'strTeste'	=>	$strTeste, 'testeNeg'	=>	$totalTesteNeg, 'testePos'	=>	$totalTestePos);
	}
	
	function construirTesteKFold($relacoes, $exemplosPos, $exemplosNeg, $k, $kAtual, $arrayPosNeg, $leaveOneOut = false) {
		$strTeste		=	"\n";
		foreach ($relacoes as $numRelacao => $relacao){
			$totalExemplos				=	sizeof($arrayPosNeg[$numRelacao]);
			if ($kAtual < ($k-1) || $leaveOneOut) {
				$tamanhoFold[$numRelacao]	=	intval($totalExemplos / $k);
				$offset	=	$tamanhoFold[$numRelacao] * $kAtual;
			}
			else {
				$tamanhoFold[$numRelacao]	=	intval($totalExemplos / $k);
				$offset	=	$tamanhoFold[$numRelacao] * $kAtual;
				$tamanhoFold[$numRelacao]	=	intval($totalExemplos / $k) + ($totalExemplos % $k);
			}
			$vetorRelacaoTemp	=	explode("(", $relacao);
			$strTeste			.=	$vetorRelacaoTemp[0] . "\n";
			$totalTesteNeg[$numRelacao]	=	0;
			$totalTestePos[$numRelacao]	=	0;
			for ($i = $offset; $i < ($tamanhoFold[$numRelacao] + $offset); $i++) {
				if ($arrayPosNeg[$numRelacao][$i]['tipo'] == '+') {
					unset($exemplosPos[$numRelacao][$arrayPosNeg[$numRelacao][$i]['indice']]);
					$strTeste	.=	$arrayPosNeg[$numRelacao][$i]['exemplo'] . ": +\n";
					$totalTestePos[$numRelacao]++;
				}
				else {
					unset($exemplosNeg[$numRelacao][$arrayPosNeg[$numRelacao][$i]['indice']]);
					$strTeste	.=	$arrayPosNeg[$numRelacao][$i]['exemplo'] . ": -\n";
					$totalTesteNeg[$numRelacao]++;
				}
			}
			
			$strTeste .= ".\n";
		}
		$strTeste	=	preg_replace("/\\n$/", "", $strTeste);
		return array('exemplosPos'	=>	$exemplosPos, 'exemplosNeg'	=>	$exemplosNeg, 'strTeste'	=>	$strTeste, 'testeNeg'	=>	$totalTesteNeg, 'testePos'	=>	$totalTestePos);
	}
	
	function executaFoil($arrayArquivo) {
		$strArquivo	=	$arrayArquivo['tipos'];
		$strArquivo	.=	construirStrConceitoAlvo($arrayArquivo['relacoes'], $arrayArquivo['exemplosPos'], $arrayArquivo['exemplosNeg']);
		$strArquivo	.=	$arrayArquivo['bk'];
		$strArquivo	.=	$arrayArquivo['teste'];
		
		if ($strArquivo != "") {
			$strArquivo.="\n";
			$arquivo	=	fopen('./foil/arquivo_entrada.d', 'wb');
			fwrite($arquivo, $strArquivo);
			fclose($arquivo);
		}
		else {
			escreveErro("Você não digitou nenhuma entrada!");
			die();
		}
		$chamada_FOIL	=	"./foil/foil6";
		$parametros		=	"";
		$arquivoEntrada	=	"./foil/arquivo_entrada.d";
		
		$parametros		=	trataParametros();
		
		if ($parametros != "erro") {
			$chamadaCompleta	=	$chamada_FOIL . $parametros . " <" . $arquivoEntrada;
			$output_FOIL	=	shell_exec($chamadaCompleta);
			$output_FOIL	=	str_replace("\n", "<br/>", $output_FOIL);
			unlink($arquivoEntrada);
		}
		if ($output_FOIL != "") {
			/*Pegando o numero de exemplos de teste positivos e negativos*/
			$totalTestePos	=	$arrayArquivo['testePos'];
			$totalTesteNeg	=	$arrayArquivo['testeNeg'];
			/*Pegando resposta do Teste para calcular medidas de Performance*/
			$testeRealizado = preg_match_all("/Test relation.*Summary: [0-9]* (errors|error) in [0-9]* (trials|trial)/", $output_FOIL, $vetorResultadoTestes);
			if ($testeRealizado) {
				$testesRelacoes	=	explode("<br/><br/>",$vetorResultadoTestes[0][0]);
				$i	=	0;
				foreach($testesRelacoes as $testeRelacao) {
					$negativoFalso	=	0;
					$positivoFalso	=	0;
					/*Calculando a Acurácia*/
					preg_match_all("/Summary: ([0-9]*) (errors|error) in ([0-9]*) (trials|trial)/", $testeRelacao, $vetorAcuracia);
					$acertos		=	$vetorAcuracia[3][0] - $vetorAcuracia[1][0];
					$total			=	$vetorAcuracia[3][0];
					$acuracia		=	$acertos / $total;

					/*Pegando o numero de erros por classe (+ e -)*/
					$falhas	=	preg_match_all("/(\+|\-)/", $testeRelacao, $vetorErrosTeste);
					if ($falhas) {
						foreach($vetorErrosTeste[0] as $erroExemplo) {
							if ($erroExemplo	==	"+") {
								$negativoFalso	++;
							}
							else {
								$positivoFalso	++;
							}
						}
					}
					$positivosVerdadeiros	=	$totalTestePos[$i]	- $negativoFalso;
					/*Calculando Sensibilidade*/
					if ($totalTestePos[$i] != 0) {
						$sensibilidade	=	$positivosVerdadeiros/$totalTestePos[$i];
						$strSensibilidade	=	"Sensibilidade: " . number_format($sensibilidade, 3, ",", ".");
					}
					else {
						$strSensibilidade	=	"Não é possível calcular a Sensibilidade.";
					}
					/*Calculando Especificidade*/
					if ($totalTesteNeg[$i] != 0) {
						$especificidade	=	($totalTesteNeg[$i]	- $positivoFalso)/$totalTesteNeg[$i];
						$strEspecificidade	=	"Especificidade: " . number_format($especificidade, 3, ",", ".");
					}
					else {
						$strEspecificidade	=	"Não é possível calcular a Especificidade.";
					}
					/*Calculando Precisao*/
					if ($positivosVerdadeiros + $positivoFalso != 0) {
						$precisao	=	$positivosVerdadeiros/($positivosVerdadeiros + $positivoFalso);
						$strPrecisao	=	"Precisão: " . number_format($precisao, 3, ",", ".");
					}
					else {
						$strPrecisao	=	"Não é possível calcular a Precisão.";
					}												
					$output_FOIL	=	str_replace($testeRelacao, $testeRelacao . "<br /> Total de Positivos de Teste: " . $totalTestePos[$i] . 
																				   "<br /> Total de Negativos de Teste: " . $totalTesteNeg[$i] . 
																				   "<br /> Número de Positivos Falsos: " . $positivoFalso . 
																				   "<br /> Número de Negativos Falsos: " . $negativoFalso . 
																				   "<br/ > Acurácia: " . number_format($acuracia, 3, ",", ".") .
																				   "<br/ >" . $strSensibilidade .
																				   "<br/ >" . $strEspecificidade .
																				   "<br/ >" . $strPrecisao , $output_FOIL);
					$i++;
				}
			}										
			/*$output_FOIL	=	str_replace("tuples that are both positive and negative", "tuplas que são tanto positivas quanto negativas", $output_FOIL);
			$output_FOIL	=	str_replace("Options", "Opções Selecionadas", $output_FOIL);
			$output_FOIL	=	str_replace("verbosity level", "Nível de detalhamento da Saída - ", $output_FOIL);
			$output_FOIL	=	str_replace("minimum clause accuracy", "Acurácia Mínima - ", $output_FOIL);
			$output_FOIL	=	str_replace("no negated literals", "Literais negados não utilizados", $output_FOIL);
			$output_FOIL	=	str_replace("negated literals only for =, > relations", "Literais negados : Apenas relações de Diferença", $output_FOIL);
			$output_FOIL	=	str_replace("allow up to", "Permitir até", $output_FOIL);
			$output_FOIL	=	str_replace("variables", "variável(s)", $output_FOIL);
			$output_FOIL	=	str_replace("or use smaller sample of negative tuples", "ou use uma amostra menor de tuplas negativas", $output_FOIL);
			$output_FOIL	=	str_replace("sample", "Utilizando uma amostra de", $output_FOIL);
			$output_FOIL	=	str_replace("of negative tuples", "de tuplas negativas", $output_FOIL);
			$output_FOIL	=	str_replace("maximum variable depth", "Profundidade máxima das variáveis - ", $output_FOIL);
			$output_FOIL	=	str_replace("maximum", "Máximo de", $output_FOIL);
			$output_FOIL	=	str_replace("consecutive weak literals", "literais fracos consecutivos", $output_FOIL);
			$output_FOIL	=	str_replace("backups from one literal", "backups de um literal", $output_FOIL);
			$output_FOIL	=	str_replace("total backups", "backups totais", $output_FOIL);
			$output_FOIL	=	str_replace("backed-up literals have", "Literais alternativos tem", $output_FOIL);
			$output_FOIL	=	str_replace("of best gain", "de melhor ganho", $output_FOIL);
			$output_FOIL	=	str_replace("use determinate literals when gain <=", "Use literais determinantes quando ganho <=", $output_FOIL);
			$output_FOIL	=	str_replace("possible", "possível", $output_FOIL);
			$output_FOIL	=	str_replace("Relation", "Relação", $output_FOIL);
			$output_FOIL	=	str_replace("[January 1996]", "", $output_FOIL);
			$output_FOIL	=	str_replace("Time", "Tempo", $output_FOIL);
			$output_FOIL	=	str_replace("secs", "segundos", $output_FOIL);
			$output_FOIL	=	str_replace("Training Set Size will exceed tuple limit", "O tamanho do conjunto de treinamento excede o limite do número de Tuplas", $output_FOIL);
			$output_FOIL	=	str_replace("Rerun with larger", "Rode novamente com um número maior de", $output_FOIL);
			$output_FOIL	=	str_replace("to proceed further", "para prosseguir", $output_FOIL);
			$output_FOIL	=	str_replace("negative tuples", "tuplas negativas", $output_FOIL);
			$output_FOIL	=	str_replace("positive tuples", "tuplas positivas", $output_FOIL);
			$output_FOIL	=	str_replace("negative tuple", "tupla negativa", $output_FOIL);
			$output_FOIL	=	str_replace("positive tuple", "tupla positiva", $output_FOIL);
			$output_FOIL	=	str_replace("warning", "Aviso", $output_FOIL);
			$output_FOIL	=	str_replace("contains", "Contém", $output_FOIL);
			$output_FOIL	=	str_replace("duplicate", "duplicatas de", $output_FOIL);
			$output_FOIL	=	str_replace("tuples", "tuplas", $output_FOIL);
			$output_FOIL	=	str_replace("Test relation", "Teste da Relação", $output_FOIL);
			$output_FOIL	=	str_replace("Summary", "Resumo", $output_FOIL);
			$output_FOIL	=	str_replace("error in", "classificação errada num total de", $output_FOIL);
			$output_FOIL	=	str_replace("trials", "exemplos de teste", $output_FOIL);
			$output_FOIL	=	str_replace("Warning: the following definition", "Aviso: Esta definição", $output_FOIL);
			$output_FOIL	=	str_replace("does not cover", "não cobre", $output_FOIL);
			$output_FOIL	=	str_replace("in the relation", "na relação", $output_FOIL);*/
			return $output_FOIL;
		}
		else {
			escreveErro("Xi... Um erro desconhecido aconteceu...");
			die();
		}
	}
	
	function escreveErro($erro) {
		?>
		<h2 class="tituloErro">Opa! Um erro ocorreu...</h2>
		<div class="divErro">
			<p>
				<?php echo $erro;?>
			</p>
			<p>
				Por favor, <a href="/netfoil" class="aCorpo">volte e tente novamente!</a>
			</p>
		</div>
		<?php
	}

	function trataParametros() {
		$parametros	=	"";
		
		switch($_POST['selectClausulasNegativas']) {
			case 'sim':
				break;
				
			case 'diferenca':
				$parametros	.=	' -N';
				break;
				
			case 'nao':
				$parametros	.=	' -n';
				break;
		}
		
		$parametros	.=	' -v' . $_POST['selectVerbosityLevel'];
		
		if ($_POST['inputNumeroVariaveis'] != "") {
			if (is_numeric($_POST['inputNumeroVariaveis'])) {
				$parametros	.=	' -V' . $_POST['inputNumeroVariaveis'];
			}
			else {
				escreveErro("O Número Máximo de Variáveis está incorreto.");
				return "erro";
			}
		}
		
		if ($_POST['inputPorcentagemClausulasNegativas'] != "") {
			if (is_numeric($_POST['inputPorcentagemClausulasNegativas']) && $_POST['inputPorcentagemClausulasNegativas'] >= 0 && $_POST['inputPorcentagemClausulasNegativas'] <= 100) {
				$parametros	.=	' -s' . $_POST['inputPorcentagemClausulasNegativas'];
			}
			else {
				escreveErro("A Porcentagem de Cláusulas Negativas deve ser um valor entre 0 e 100.");
				return "erro";
			}
		}
		
		if ($_POST['inputNumeroTuplas'] != "") {
			if (is_numeric($_POST['inputNumeroTuplas'])) {
				$parametros	.=	' -m' . $_POST['inputNumeroTuplas'];
			}
			else {
				escreveErro("O Número Máximo de Tuplas está incorreto.");
				return "erro";
			}
		}
		
		if ($_POST['inputLimiteProfundidade'] != "") {
			if (is_numeric($_POST['inputLimiteProfundidade'])) {
				$parametros	.=	' -d' . $_POST['inputLimiteProfundidade'];
			}
			else {
				escreveErro("O Limite Máximo de Profundidade das Variáveis está incorreto.");
				return "erro";
			}
		}
		
		if ($_POST['inputLiteraisFracos'] != "") {
			if (is_numeric($_POST['inputLiteraisFracos'])) {
				$parametros	.=	' -w' . $_POST['inputLiteraisFracos'];
			}
			else {
				escreveErro("O Tamanho Máximo da Seqüencia de Literais Fracos está incorreto.");
				return "erro";
			}
		}
		
		if ($_POST['inputAcuraciaMinima'] != "") {
			if (is_numeric($_POST['inputAcuraciaMinima']) && $_POST['inputAcuraciaMinima'] >= 0 && $_POST['inputAcuraciaMinima'] <= 100) {
				$parametros	.=	' -a' . $_POST['inputAcuraciaMinima'];
			}
			else {
				escreveErro("A Acurácia Mínima deve ser um valor entre 0 e 100.");
				return "erro";
			}
		}
		
		if ($_POST['inputLimiteAlternativas'] != "") {
			if (is_numeric($_POST['inputLimiteAlternativas'])) {
				$parametros	.=	' -l' . $_POST['inputLimiteAlternativas'];
			}
			else {
				escreveErro("O Limite de Alternativas está incorreto.");
				return "erro";
			}
		}
		
		if ($_POST['inputLimiteCheckpoints'] != "") {
			if (is_numeric($_POST['inputLimiteCheckpoints'])) {
				$parametros	.=	' -t' . $_POST['inputLimiteCheckpoints'];
			}
			else {
				escreveErro("O Número Máximo de Checkpoints está incorreto.");
				return "erro";
			}
		}
		
		if ($_POST['inputGanhoMinimo'] != "") {
			if (is_numeric($_POST['inputGanhoMinimo']) && $_POST['inputGanhoMinimo'] >= 0 && $_POST['inputGanhoMinimo'] <= 100) {
				$parametros	.=	' -f' . $_POST['inputGanhoMinimo'];
			}
			else {
				escreveErro("O Ganho Mínimo deve ser um valor entre 0 e 100.");
				return "erro";
			}
		}
		
		if ($_POST['inputGanhoPossivel'] != "") {
			if (is_numeric($_POST['inputGanhoPossivel']) && $_POST['inputGanhoPossivel'] >= 0 && $_POST['inputGanhoPossivel'] <= 100) {
				$parametros	.=	' -g' . $_POST['inputGanhoPossivel'];
			}
			else {
				escreveErro("A Última Opção deve ser um valor entre 0 e 100.");
				return "erro";
			}
		}
		
		return $parametros;
	}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
	<head>
		<meta http-equiv="Content-type" content="text/html; charset=UTF-8" />
		<link href="./estilo.css" type="text/css" rel="stylesheet"/>
		<script type="text/javascript" src="./javascript.js"></script>
		<title>
			NetFoil - Um sistema de Aprendizado Online
		</title>
	</head>
	<body onload="javascript:inicio();">
		<div id="divSite">
			<div id="divCabecalho">
				<a href="/netfoil">
					<img src="./imagens/netfoilpequeno.png" alt="Logo NetFoil" title="NetFoil - Um sistema de Aprendizado Online" />
				</a>
				<h1>
					Sistema de Aprendizado Online
				</h1>
			</div>
			<div id="divPrincipal">
				<div id="divSuperior">
				</div>
				<div id="divCentral">
					<?php
						if ($_POST) {
							if ($_POST['radioInput'] == 'arquivo') {
								$arquivo			=	$_FILES['inputArquivo'];
								$arquivoTeste		=	$_FILES['inputArquivoTeste'];
								$strTipos			=	"";
								$strConceitoAlvo	=	"";
								$strBK				=	"";
								if ($arquivo['name'] != '' && $arquivo['size'] > 0) {
									move_uploaded_file($arquivo['tmp_name'], './foil/arquivo_temporario1.d');
									
									if($arquivoTemp	=	fopen('./foil/arquivo_temporario1.d', 'rb')) {
										$strTemp		=	fread($arquivoTemp, filesize('./foil/arquivo_temporario1.d'));
										fclose($arquivoTemp);
										unlink('./foil/arquivo_temporario1.d');
									}
									$arrayEntrada	=	explode("\n\n", $strTemp);
									
									$strTipos	=	$arrayEntrada[0];
									$arrayRelacoes	=	explode("\n.\n", $arrayEntrada[1]);
									array_pop($arrayRelacoes);
									
									foreach($arrayRelacoes as $relacao) {
										if (preg_match("/^\*.*/", $relacao)) {
											$strBK	.=	$relacao . "\n.\n";
										}
										else {
											$strConceitoAlvo	.=	$relacao . "\n.\n";
										}
									}
								}
								else {
									escreveErro("Você não enviou nenhum arquivo!");
									die();
								}
								$strTeste	=	"";
								if ($_POST['inputDivisaoFolds'] == 'comexemplo') {
									if ($arquivoTeste['name'] != '' && $arquivoTeste['size'] > 0) {
										move_uploaded_file($arquivoTeste['tmp_name'], './foil/arquivo_temporario2.d');
										
										if($arquivoTemp	=	fopen('./foil/arquivo_temporario2.d', 'rb')) {
											$strTeste	=	fread($arquivoTemp, filesize('./foil/arquivo_temporario2.d'));
											fclose($arquivoTemp);
											unlink('./foil/arquivo_temporario2.d');
										}
									}
									else {
										escreveErro("Você não enviou nenhum arquivo de teste!");
										die();
									}
								}
								
								$arrayArquivo	=	preparaString($strTipos, $strConceitoAlvo, $strBK, $strTeste);
							}
							else {
								//TODO Tirar enter do inicio da string
								if ($_POST['radioInput'] == 'manual') {
									$strTeste	=	isset($_POST['textareaInputManualTeste']) ? $_POST['textareaInputManualTeste'] : "";
									$arrayArquivo	=	preparaString($_POST['textareaInputManualTiposConstantes'], $_POST['textareaInputManualConceitoAlvo'], $_POST['textareaInputManualBK'], $strTeste);
								}
							}
							
							$divisaoFolds	=	$_POST['inputDivisaoFolds'];
							switch($divisaoFolds) {
								case "semexemplo":
									$output_FOIL = executaFoil($arrayArquivo);
									?>
									<h1 class="tituloResultado">Resultado obtido</h1>
									<p class="pResultadoObtido">
										<?php echo $output_FOIL;?>
									</p>
									<?php 
									break;
								case "comexemplo":
									$output_FOIL = executaFoil($arrayArquivo);
									?>
									<h1 class="tituloResultado">Resultado obtido</h1>
									<p class="pResultadoObtido">
										<?php echo $output_FOIL;?>
									</p>
									<?php 
									break;
								case "holdout":
									$resultado	=	construirTesteHoldout($arrayArquivo['relacoes'], $arrayArquivo['exemplosPos'], $arrayArquivo['exemplosNeg']);
									$arrayArquivo['exemplosPos']	=	$resultado['exemplosPos'];
									$arrayArquivo['exemplosNeg']	=	$resultado['exemplosNeg'];
									$arrayArquivo['teste']			=	$resultado['strTeste'];
									$arrayArquivo['testeNeg']	=	$resultado['testeNeg'];
									$arrayArquivo['testePos']			=	$resultado['testePos'];
									$output_FOIL = executaFoil($arrayArquivo);
									?>
									<h1 class="tituloResultado">Resultado obtido</h1>
									<p class="pResultadoObtido">
										<?php echo $output_FOIL;?>
									</p>
									<?php 
									break;
								case "kfold":
									$k	=	$_POST['inputK'];
									if (!is_numeric($k) || $k <= 1) {
										escreveErro("Valor inválido para K");
										die();
									}
									$arrayPosNeg	=	array();
									foreach($arrayArquivo['relacoes'] as $chave => $relacao) {
										for ($i = 0; $i < sizeof($arrayArquivo['exemplosPos'][$chave]); $i++) {
											$arrayPosNeg[$chave][$i]	=	array('exemplo' => $arrayArquivo['exemplosPos'][$chave][$i], 'tipo' => '+', 'indice' => $i);
										}
										for ($i = 0; $i < sizeof($arrayArquivo['exemplosNeg'][$chave]); $i++) {
											$arrayPosNeg[$chave][$i + sizeof($arrayArquivo['exemplosPos'][$chave])]	=	array('exemplo' => $arrayArquivo['exemplosNeg'][$chave][$i], 'tipo' => '-', 'indice' => $i);
										}
										shuffle($arrayPosNeg[$chave]);
									}
									
									for ($i = 0; $i < $k; $i++){
										$resultado			= construirTesteKFold($arrayArquivo['relacoes'], $arrayArquivo['exemplosPos'], $arrayArquivo['exemplosNeg'], $k, $i, $arrayPosNeg);
										$arrayArquivoTemp	= $arrayArquivo;
										$arrayArquivoTemp['exemplosPos']	=	$resultado['exemplosPos'];
										$arrayArquivoTemp['exemplosNeg']	=	$resultado['exemplosNeg'];
										$arrayArquivoTemp['teste']			=	$resultado['strTeste'];
										$arrayArquivoTemp['testeNeg']		=	$resultado['testeNeg'];
										$arrayArquivoTemp['testePos']		=	$resultado['testePos'];
										$output_FOIL		= executaFoil($arrayArquivoTemp);
										?>
										<h1 class="tituloResultado">Resultado obtido no experimento K = <?php echo ($i+1);?></h1>
										<p class="pResultadoObtido">
											<?php echo $output_FOIL;?>
										</p>
										<?php
									}
									break;
								case "leaveoneout":
									$arrayPosNeg	=	array();
									foreach($arrayArquivo['relacoes'] as $chave => $relacao) {
										for ($i = 0; $i < sizeof($arrayArquivo['exemplosPos'][$chave]); $i++) {
											$arrayPosNeg[$chave][$i]	=	array('exemplo' => $arrayArquivo['exemplosPos'][$chave][$i], 'tipo' => '+', 'indice' => $i);
										}
										for ($i = 0; $i < sizeof($arrayArquivo['exemplosNeg'][$chave]); $i++) {
											$arrayPosNeg[$chave][$i + sizeof($arrayArquivo['exemplosPos'][$chave])]	=	array('exemplo' => $arrayArquivo['exemplosNeg'][$chave][$i], 'tipo' => '-', 'indice' => $i);
										}
										shuffle($arrayPosNeg[$chave]);
									}
									if (sizeof($arrayPosNeg) != 1) {
										escreveErro("Só é possível utilizar o método Leave One Out com uma relação alvo.");
										die();
									}
									$k = sizeof($arrayPosNeg[0]);
									
									for ($i = 0; $i < $k; $i++){
										$resultado			= construirTesteKFold($arrayArquivo['relacoes'], $arrayArquivo['exemplosPos'], $arrayArquivo['exemplosNeg'], $k, $i, $arrayPosNeg, true);
										$arrayArquivoTemp	= $arrayArquivo;
										$arrayArquivoTemp['exemplosPos']	=	$resultado['exemplosPos'];
										$arrayArquivoTemp['exemplosNeg']	=	$resultado['exemplosNeg'];
										$arrayArquivoTemp['teste']			=	$resultado['strTeste'];
										$arrayArquivoTemp['testeNeg']		=	$resultado['testeNeg'];
										$arrayArquivoTemp['testePos']		=	$resultado['testePos'];
										$output_FOIL		= executaFoil($arrayArquivoTemp);
										?>
										<h1 class="tituloResultado">Resultado obtido no experimento K = <?php echo ($i+1);?></h1>
										<p class="pResultadoObtido">
											<?php echo $output_FOIL;?>
										</p>
										<?php
									}
									break;
							}
						}
						else {
							?>
							<form id="formPrincipal" method="post" action="" enctype="multipart/form-data">
								<fieldset id="fieldsetEscolhaInput">
									<legend>
										Escolha de input
									</legend>
									<div class="divRadioEscolhaInput">
										<input id="radioInputArquivo" name="radioInput" type="radio" value="arquivo" onclick="javascript:exibeInput('arquivo');" />
										<label id="labelInputArquivo" for="radioInputArquivo" onclick="javascript:exibeInput('arquivo');">Envio de Arquivo</label>
									</div>
									<div class="divRadioEscolhaInput">
										<input id="radioInputManual" name="radioInput" type="radio" value="manual" onclick="javascript:exibeInput('manual');" />
										<label id="labelInputManual" for="radioInputManual" onclick="javascript:exibeInput('manual');">Entrada Manual</label>
									</div>
								</fieldset>
								<!-- DIV PEDINDO SELECAO DE INPUT -->
								<div id="divExplicacao">
									<p>
										Bem vindo ao NetFoil!
									</p>
									<p>
										Por favor, selecione um método de entrada de dados acima para continuar...
									</p>
								</div>
								<!-- FIELDSET DE INPUT DE ARQUIVO -->
								<fieldset id="fieldsetInputArquivo">
									<legend>
										Escolha de Arquivo
									</legend>
									<div id="divEscolhaArquivo">
										<label class="labelEscolhaArquivo">Escolha o arquivo</label>
										<input type="file" name="inputArquivo" />
									</div>
								</fieldset>
								<!-- FIELDSET DE INPUT MANUAL -->
								<fieldset id="fieldsetInputManual">
									<legend>
										Entrada Manual
									</legend>
									<p id="pExplicacaoEntradaManual">
										Aqui vai entrar uma explicação sobre a formatação do arquivo de entrada...
									</p>
									<div class="divEntradaManual">
										<label id="labelEntradaManualTiposConstantes" class="labelEntradaManual" for="textareaInputManualTiposConstantes">Tipos e Constantes</label>
										<div class="divExplicacaoOculta" id="divExplicacaoOcultaEspecial1">
											<div class="divTextoExplicacaoOculta">
												<p>
													Formato:
												</p>
												<p>
													Tipo1: constante1, constante2, constante3, ..., constanteN.
												</p>
												<p>
													Tipo2: constante1, constante2, constante3, ..., constanteN.
												</p>
											</div>
										</div>
										<textarea rows="5" cols="80" name="textareaInputManualTiposConstantes" id="textareaInputManualTiposConstantes"></textarea>
									</div>
																		
									<div class="divEntradaManual">
										<label id="labelEntradaManualExemplos" class="labelEntradaManual" for="textareaInputManualConceitoAlvo">Conceito Alvo e Exemplos</label>
										<div class="divExplicacaoOculta" id="divExplicacaoOcultaEspecial2">
											<div class="divTextoExplicacaoOculta">
												<p>
													Formato:
												</p>
												<p>
													Conceito1(TipoA,TipoB)
												</p>
												<p>
													constanteTipoA1,constanteTipoB1,
												</p>
												<p>
													constanteTipoA2,constanteTipoB2
												</p>
												<p>
													;
												</p>
												<p>
													constanteTipoA3,constanteTipoB3,
												</p>
												<p>
													constanteTipoA4,constanteTipoB4
												</p>
												<p>
													.
												</p>
												<p>
													Os dois primeiros exemplos são positivos(antes de "<strong>;</strong>"-<strong>ponto e vírgula</strong>) e os dois últimos são negativos.
												</p>
												<p>
													Pode-se aprender mais de um conceito de uma só vez.
												</p>
											</div>
										</div>
										<textarea rows="10" cols="80" name="textareaInputManualConceitoAlvo" id="textareaInputManualConceitoAlvo"></textarea>
									</div>
									
									<div class="divEntradaManual">
										<label class="labelEntradaManual" id="labelEntradaManualBK" for="textareaInputManualBK">Conhecimento Preliminar</label>
										<div class="divExplicacaoOculta" id="divExplicacaoOcultaEspecial3">
											<div class="divTextoExplicacaoOculta">
												<p>
													Formato:
												</p>
												<p>
													*Predicado(Tipo1,Tipo2) #-
												</p>
												<p>
													constanteTipo1,constanteTipo2
												</p>
												<p>
													constanteTipo1,constanteTipo2
												</p>
												<p>
													.
												</p>
												<p>
													A <strong>#</strong> informa que a variável de Tipo1 é de entrada e o <strong>-</strong> significa que a variável de Tipo 2 pode ser tanto de entrada como de saída.
												</p>
												<p>
													Pode-se colocar quantos predicados forem necessários no Conhecimento Preliminar.
												</p>
											</div>
										</div>
										<textarea rows="10" cols="80" name="textareaInputManualBK" id="textareaInputManualBK"></textarea>
									</div>
								</fieldset>
								<!-- FIELDSET DE OPCOES -->
								<fieldset id="fieldsetOpcoes">
									<legend>
										Escolha de Opções
									</legend>
									<!-- RUNNING OPTIONS -->
									<div class="divOpcao">
										<label class="labelOpcao">
											Divisão do conjunto de Exemplos para teste:
										</label>
										<div class="divDivisaoFolds">
											<input type="radio" name="inputDivisaoFolds" id="inputDivisaoFoldsSemExemplo" value="semexemplo" onclick="javascript:controlaVisibilidadeTeste(this);"/>
											<label class="labelDivisaoFolds" for="inputDivisaoFoldsSemExemplo" onclick="javascript:controlaVisibilidadeTeste(this);">
												Não Testar
											</label>
										</div>
										<div class="divDivisaoFolds" id="divDivisaoFoldsComExemplo">
											<input type="radio" name="inputDivisaoFolds" id="inputDivisaoFoldsComExemplo" value="comexemplo" onclick="javascript:controlaVisibilidadeTeste(this);" />
											<label class="labelDivisaoFolds" for="inputDivisaoFoldsComExemplo" onclick="javascript:controlaVisibilidadeTeste(this);" >
												Testar utilizando outros exemplos
											</label>
											<!-- INPUT MANUAL DE EXEMPLOS -->
											<div id="divInputManualTeste">
												<label class="labelEntradaManual" for="textareaInputManualTeste">Exemplos de Teste</label>
												<textarea rows="5" cols="75" name="textareaInputManualTeste" id="textareaInputManualTeste"></textarea>
											</div>
											<!-- INPUT ARQUIVO DE EXEMPLOS -->
											<div id="divInputArquivoTeste">
												<label class="labelEscolhaArquivoTeste" for="inputArquivoTeste">Exemplos de Teste</label>
												<input type="file" name="inputArquivoTeste" id="inputArquivoTeste" />
											</div>
										</div>
										<div class="divDivisaoFolds" id="divDivisaoFoldsKFold">
											<input type="radio" name="inputDivisaoFolds" id="inputDivisaoFoldsKFold" value="kfold" onclick="javascript:controlaVisibilidadeTeste(this);"/>
											<label class="labelDivisaoFolds" for="inputDivisaoFoldsKFold" onclick="javascript:controlaVisibilidadeTeste(this);">
												Utilizar K-Fold Cross Validation
											</label>
											<!-- INPUT NUMERO FOLDS -->
											<div id="divInputKFold">
												<label class="labelOpcao" for="inputK">Nº de Folds</label>
												<input type="text" name="inputK" id="inputK" />
											</div>
										</div>
										<div class="divDivisaoFolds">
											<input type="radio" name="inputDivisaoFolds" id="inputDivisaoFoldsHoldOut" value="holdout" onclick="javascript:controlaVisibilidadeTeste(this);"/>
											<label class="labelDivisaoFolds" for="inputDivisaoFoldsHoldOut" onclick="javascript:controlaVisibilidadeTeste(this);">
												Utilizar HoldOut
											</label>
										</div>
										<div class="divDivisaoFolds">
											<input type="radio" name="inputDivisaoFolds" id="inputDivisaoFoldsLeaveOneOut" value="leaveoneout" onclick="javascript:controlaVisibilidadeTeste(this);"/>
											<label class="labelDivisaoFolds" for="inputDivisaoFoldsLeaveOneOut" onclick="javascript:controlaVisibilidadeTeste(this);">
												Utilizar Leave one Out
											</label>
										</div>
									</div>
									<div class="divOpcao">
										<label class="labelOpcao">
											Considerar cláusulas negativas?
										</label>
										<select name="selectClausulasNegativas">
											<option value="sim">
												Sim, todas.
											</option>
											<!-- Corresponde ao argumento -N -->
											<option value="diferenca">
												Sim, mas somente cláusulas de diferença.
											</option>
											<!-- Corresponde ao argumento -n -->
											<option value="nao">
												Não, nenhuma.
											</option>
										</select>
										<div class="divExplicacaoOculta">
											<div class="divTextoExplicacaoOculta">
												<p>
													Possíveis escolhas e seus significados:
												</p>
												<ul id="listaDicaOpcao1">
													<li>
														<strong>Sim, todas.</strong> - Todas as cláusulas negativas serão consideradas pelo algoritmo FOIL.
													</li>
													<li>
														<strong>Sim, mas somente cláusulas de diferença.</strong> - Somente cláusulas do tipo A&lt;&gt;B ou A&lt;&gt;constante serão consideradas.
													</li>
													<li>
														<strong>Não, nenhuma.</strong> - Nenhuma cláusula negativa ou de diferença será considerada.
													</li>
												</ul>
											</div>
										</div>
									</div>
									<div class="divOpcao">
										<label class="labelOpcao">
											Nível de detalhamento da saída
										</label>
										<select name="selectVerbosityLevel">
											<!-- Corresponde ao argument -vNUMEROESCOLHIDO -->
											<?php
												for ($i = 0; $i <= 4; $i++) {
													?>
													<option value="<?php echo $i;?>">
														<?php echo $i;?>
													</option>
													<?php
												}
											?>
										</select>
										<div class="divExplicacaoOculta">
											<div class="divTextoExplicacaoOculta">
												<p>
													O <strong>Nível de Detalhamento da Saída</strong> indica o quão explicativa sobre os passos do algoritmo e suas decisões será a saída gerada.
												</p>
												<p>
													Quanto mais alto o Nível, mais detalhes sobre os passos do algoritmo serão exibidos.
												</p>
											</div>
										</div>
									</div>
									<div class="divOpcao">
										<label class="labelOpcao">
											Número máximo de variáveis
										</label>
										<!-- Corresponde ao argumento -VNUMEROESCOLHIDO -->
										<input id="inputNumeroVariaveis" name="inputNumeroVariaveis" type="text" maxlength="20" />
										<div class="divExplicacaoOculta">
											<div class="divTextoExplicacaoOculta">
												<p>
													Define o <strong>Número Máximo de Variáveis</strong> que pode ser utilizado pelo algoritmo na busca por uma definição.
												</p>
												<p>
													<i>Valor default: 52.</i>
												</p>
											</div>
										</div>
									</div>
									<div class="divOpcao">
										<label class="labelOpcao">
											Considerar apenas uma porcentagem de cláusulas negativas?
										</label>
										<input id="inputPorcentagemClausulasNegativas" name="inputPorcentagemClausulasNegativas" maxlength="3" />
										<div class="divExplicacaoOculta">
											<div class="divTextoExplicacaoOculta">
												<p>
													Ao utilizar a <strong>Hipótese do Mundo Fechado</strong> em alguns aprendizados, muitas cláusulas negativas podem ser geradas. Esta opção faz com que somente uma porcentagem de cláusulas negativas seja avaliada.
												</p>
												<p>
													<i>Esta opção não faz efeito se as cláusulas negativas forem dadas explicitamente.</i>
												</p>
											</div>
										</div>
									</div>
									<div class="divOpcao">
										<label class="labelOpcao">
											Número máximo de tuplas
										</label>
										<!-- Corresponde ao argumento -mNUMEROESCOLHIDO -->
										<input id="inputNumeroTuplas" name="inputNumeroTuplas" type="text" maxlength="20" />
										<div class="divExplicacaoOculta">
											<div class="divTextoExplicacaoOculta">
												<p>
													Define o <strong>Número Máximo de Tuplas</strong>, se você obtiver avisos sobre a exclusão de literais devido ao limite máximo de tuplas, aumente este valor. Entretanto, quanto maior este valor, mais tempo o algoritmo demorará para rodar.
												</p>
												<p>
													<i>Valor default: 100000.</i>
												</p>
											</div>
										</div>
									</div>
									<div class="divOpcao">
										<label class="labelOpcao">
											Limite de profundidade de variáveis
										</label>
										<!-- Corresponde ao argumento -dNUMEROESCOLHIDO -->
										<input id="inputLimiteProfundidade" name="inputLimiteProfundidade" type="text" maxlength="20" />
										<div class="divExplicacaoOculta">
											<div class="divTextoExplicacaoOculta">
												<p>
													Deefine a <strong>Profundidade Máxima de Variáveis</strong> em literais.
												</p>
												<p>
													<i>Valor default: 4.</i>
												</p>
											</div>
										</div>
									</div>
									<div class="divOpcao">
										<label class="labelOpcao">
											Seqüência máxima de literais fracos
										</label>
										<!-- Corresponde ao argumento -wNUMEROESCOLHIDO -->
										<input id="inputLiteraisFracos" name="inputLiteraisFracos" type="text" maxlength="20" />
										<div class="divExplicacaoOculta">
											<div class="divTextoExplicacaoOculta">
												<p>
													<strong>Literais Fracos</strong> são literais que apresentam ganho 0.
												</p>
												<p>
													Esta opção define a maior seqüência de literais fracos que o FOIL irá aceitar.
												</p>
												<p>
													<i>Valor default: 4.</i>
												</p>
											</div>
										</div>
									</div>
									<div class="divOpcao">
										<label class="labelOpcao">
											Acurácia mínima
										</label>
										<!-- Corresponde ao argumento -aNUMEROESCOLHIDO -->
										<input id="inputAcuraciaMinima" name="inputAcuraciaMinima" type="text" maxlength="3" />
										<div class="divExplicacaoOculta">
											<div class="divTextoExplicacaoOculta">
												<p>
													Este campo só aceita valores de 0 a 100. (Porcentagens)
												</p>
												<p>
													Esta opção define a <strong>Acurácia Mínima</strong> de cláusulas que o FOIL irá aceitar em seu aprendizado. Qualquer cláusula com acurácia menor que a escolhida será descartada.
												</p>
												<p>
													<i>Valor default: 80%.</i>
												</p>
											</div>
										</div>
									</div>
									<div class="divOpcao">
										<label class="labelOpcao">
											Limite de alternativas
										</label>
										<!-- Corresponde ao argumento -lNUMEROESCOLHIDO -->
										<input id="inputLimiteAlternativas" name="inputLimiteAlternativas" type="text" maxlength="20" />
										<div class="divExplicacaoOculta">
											<div class="divTextoExplicacaoOculta">
												<p>
													Define o <strong>Número Máximo de Literais Alternativos</strong> que o FOIL guardará.
												</p>
												<p>
													<i>Valor default: 5.</i>
												</p>
											</div>
										</div>
									</div>
									<div class="divOpcao">
										<label class="labelOpcao">
											Número máximo de Checkpoints
										</label>
										<!-- Corresponde ao argumento -tNUMEROESCOLHIDO -->
										<input id="inputLimiteCheckpoints" name="inputLimiteCheckpoints" type="text" maxlength="20" />
										<div class="divExplicacaoOculta">
											<div class="divTextoExplicacaoOculta">
												<p>
													Define o <strong>Número Máximo de Checkpoints</strong> em determinado momento.
												</p>
												<p>
													<i>Valor default: 20.</i>
												</p>
											</div>
										</div>
									</div>
									<div class="divOpcao">
										<label class="labelOpcao">
											Porcentagem mínima de ganho para literais alternativos
										</label>
										<!-- Corresponde ao argumento -fNUMEROESCOLHIDO -->
										<input id="inputGanhoMinimo" name="inputGanhoMinimo" type="text" maxlength="3" />
										<div class="divExplicacaoOculta">
											<div class="divTextoExplicacaoOculta">
												<p>
													Este campo só aceita valores de 0 a 100. (Porcentagens)
												</p>
												<p>
													Define a porcentagem do ganho do melhor literal que os literais alternativos devem possuir.
												</p>
												<p>
													<i>Valor default: 80%.</i>
												</p>
											</div>
										</div>
									</div>
								</fieldset>
								<!-- FIELDSET ENVIAR -->
								<fieldset id="fieldsetEnviar">
									<legend>
										Pronto para aprender?
									</legend>
									<input type="submit" name="btnEnviar" value="Aprender!" />
								</fieldset>
							</form>
							<?php
						}
					?>
				</div>
				<div id="divInferior">
				</div>
			</div>
			<div id="divRodape">
				<p id="pDesenvolvedorSistema">
					Desenvolvido por <a href="mailto:digoxavi@gmail.com" class="aRodape">Diego Xavier</a> e <a href="mailto:vl.ribeiro3@gmail.com" class="aRodape">Vinícius Ribeiro</a>
				</p>
				<p id="pDesenvolvedorAlgoritmo">
					Algoritmo Foil por <a href="http://www.rulequest.com/Personal/" class="aRodape">Ross Quinlan</a>
				</p>
			</div>
		</div>
	</body>
</html>